package com.le.tester.book.effectivejava3rdchinese.secondReading.l31;

import java.util.Collection;
import java.util.EmptyStackException;
import java.util.List;

/**
 * createTime：2024-09-10 13:55
 * description：
 */
public class Stack<E> {
    private E[] element;
    private int size = 0;

    public Stack() {
    }

    public void push(E e) {
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public E pop() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        E e = element[--size];
        //这边要赋值为null，才能进行栈的值回收
        element[size] = null;
        return e;
    }

//    //假设此时的E是根
//    public void pushAll(Iterable<E> src) {
//        for (E e : src) {
//            push(e);
//        }
//    }

    //extend E为了E添加更多的树枝,生产者
    public void pushAll(Iterable<? extends E> src) {
        for (E e : src) {
            push(e);
        }
    }

    //    public void popAll(Collection<E> dst) {
//        while (!dst.isEmpty()) {
//            dst.add(pop());
//        }
//    }
    //认定散播的枝叶，消费者
    public void popAll(Collection<? super E> dst) {
        while (!isEmpty())
            dst.add(pop());
    }

//A
//    public static <E> void swap(List<E> list, int i, int j) {
//
//    }

    //相比较第二种方法的时候，此种方法暴露给用户更为合适，用户需要关系传入的参数类型
    public static void swap(List<?> list, int i, int j) {

        //但是代码的实现内部上要进行转换
        swapHelper(list, i, j);
    }

    private static <T> void swapHelper(List<T> list, int i, int j) {
        list.set(i, list.set(j, list.get(i)));
    }


}
